package muhnes.sizoo.controlador;

import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ComponentSystemEvent;
import javax.faces.model.SelectItem;
import muhnes.sizoo.dal.AnimalDao;
import muhnes.sizoo.dal.EspecimenDao;
import muhnes.sizoo.dal.FabricaDAO;
import muhnes.sizoo.dal.RecoleccionDao;
import muhnes.sizoo.modelo.Acuatico;
import muhnes.sizoo.modelo.Animal;
import muhnes.sizoo.modelo.Especimen;
import muhnes.sizoo.modelo.Recoleccion;
import muhnes.sizoo.modelo.Terrestre;
import muhnes.sizoo.util.TipoEspecimen;
import org.primefaces.event.SelectEvent;

/**
 * Clase que contiene los metodos para generar la ficha de los especimenes
 * @author Oscar Castillo
 */
@ManagedBean(name = "fichaBean")
@SessionScoped
public class FichaBean implements Serializable{
    private Acuatico acuatico;
    private Especimen especimen;
    private Terrestre terrestre;
    
    private TipoEspecimen tipoEspecimen;
    private List<Especimen> listaEspecimens;
    private List< SelectItem > itemsEspecimen;
    private List< SelectItem > listaAnimal;
    private List< SelectItem > listaRecoleccion;
    private String codigo = "";
    private Especimen especimenSeleccionado;
  
   private Especimen muestra =null;
  private boolean tieneValor = false;
  private String tipoReporte = "";
  private String tipoReporteCF = "";
  private String tipoReporteSF = "";
  private String rutaFoto = "";
   private boolean usaFoto = true;  
  
    /** 
     * Crea una nueva instancia de AnimalBean 
     */
    public FichaBean() {
        acuatico = new Acuatico();
        especimen= new Especimen();
        terrestre = new Terrestre();    
        especimenSeleccionado = new Especimen();
    }
    
    public void validarAcceso(ComponentSystemEvent evento) throws IOException {
        //boolean accesoPermitido = sesionBean.verificarPermiso("acceder", vistaProtegida); 
        
        /*if( !accesoPermitido ) {
            FacesContext contexto = FacesContext.getCurrentInstance();
            String nombreContexto = contexto.getExternalContext().getRequestContextPath();
            String urlError = nombreContexto + "/paginas/errores/error.xhtml";
            contexto.getExternalContext().redirect(urlError);
        }*/
    }

    /**
     * Obtiene un dato de tipo Especimen
     *  
     */
    public Especimen getEspecimen() {
        return especimen;
    }

    /**
     * Selecciona un dato de tipo especimen
     * @param especimen 
     */
    public void setEspecimen(Especimen especimen) {
        this.especimen = especimen;
    }

    /**
     * Obtiene un dato de tipo Acuatico
     *  
     */
    public Acuatico getAcuatico() {
        return acuatico;
    }

    /**
     * Selecciona un dato de tipo Acuatico
     * @param acuatico 
     */
    public void setAcuatico(Acuatico acuatico) {
        this.acuatico = acuatico;
    }
    
    /**
     * Obtiene un dato de tipo Terrestre
     * 
     */
    public Terrestre getTerrestre() {
        return terrestre;
    }

    /**
     * Selecciona un dato de tipo terrestre
     * @param terrestre 
     */
    public void setTerrestre(Terrestre terrestre) {
        this.terrestre = terrestre;
    }
    
    /**
     * Obtiene un dato de TipoEspecimen
     * 
     */
    public TipoEspecimen getTipoEspecimen(){
        return tipoEspecimen;
    }
    
    /**
     * Selecciona un dato de TipoEspecimen
     * @param tipoEspecimen 
     */
    public void setTipoEspecimen (TipoEspecimen tipoEspecimen){
        this.tipoEspecimen = tipoEspecimen;
    };
    
    /**
     * Obtiene una lista de especimenes
     * @return objeto list
     */
    public List< Especimen > getListaEspecimens() {
        if( listaEspecimens == null ) {
            EspecimenDao especimenDao = FabricaDAO.crearEspecimenDao();
            listaEspecimens = especimenDao.buscarTodos();
            
        }
        return listaEspecimens;
    }
    
    /**
     * Metodo que asigna un objeto de tipo especimen al cambiar la opcion del menu
     */
      public void  asignarReporte() {
          Recoleccion rec = null;
          
          Especimen seleccion =null;
           
          seleccion = obtenerEspecimen();
          setMuestra(seleccion);
            
          rec = muestra.getRecoleccion();
          obtenerRutaReporte(muestra,rec);
          
          
          
       
    }
    
    

      /**
       * Metodo que obtiene un especimen
       *  
       */
      public Especimen obtenerEspecimen(){
      
           EspecimenDao especimenDao = FabricaDAO.crearEspecimenDao();
           return especimenDao.buscarPorId(this.getCodigo());
          
      }
      
      /**
       * Metodo que invoca los reportes
       * 
       * 
       */
      public void obtenerRutaReporte(Especimen muestra, Recoleccion rec){
      
          String reporte="";
          String reporteSF="";
          
          if(muestra.getTipoespecimen() =='T'){
       
              if(rec.getTiporecoleccion() == 'N'){
            
              reporte ="/reportes/FichaTerrestre.jasper";
              reporteSF ="/reportes/FichaTerrestreSF.jasper";
               }
              else{
              reporte ="/reportes/FichaIntTerrestre.jasper";
              reporteSF ="/reportes/FichaIntTerrestreSF.jasper";
              
               }
         
           }// FIN DE  IF  tipo especimen 
           else
              if(muestra.getTipoespecimen() == 'A'){
            
               if(rec.getTiporecoleccion() == 'N'){
            
                 reporte="/reportes/FichaAcuatica.jasper";
                 reporteSF="/reportes/FichaAcuaticaSF.jasper";
              }
               else{
                 reporte="/reportes/FichaIntAcuatica.jasper";
                 reporteSF="/reportes/FichaIntAcuaticaSF.jasper";
               }
            
              System.out.println("entro a acuatico");
          
        }
          setTipoReporte(reporte,reporteSF);
      }
        
      /**
       * Metodo que devuelve una lista de especimenes
       * @return objeto list
       */
    public List< SelectItem > getItemsEspecie() {
        if( itemsEspecimen == null ) {
            itemsEspecimen = new ArrayList< SelectItem >();
            EspecimenDao especimenDao = FabricaDAO.crearEspecimenDao();
            for( Especimen especimen : especimenDao.buscarTodos() ) {
                SelectItem item = new SelectItem( especimen, especimen.getCodigoespecimen());
                
                itemsEspecimen.add( item );
            }
        }
        return itemsEspecimen;
    }
    
    /**
     * Metodo que devuelve una lista de animales
     * @return objeto list
     */
     public List< SelectItem > getListaAnimal() {
        if( listaAnimal == null ) {
            listaAnimal = new ArrayList< SelectItem >();
            AnimalDao animalDao = FabricaDAO.crearAnimalDao();
            for( Animal animal : animalDao.buscarTodos() ) {
                SelectItem item = new SelectItem( animal, animal.getNombrecientifico() );
                listaAnimal.add( item );
            }
        }
        return listaAnimal;
    }
     /**
      * Metodo que devuelve una lista de recolecciones
      * @return objeto list
      */
    public List< SelectItem > getListaRecoleccion() {
        
        java.text.SimpleDateFormat fecha=new java.text.SimpleDateFormat("dd/MM/yyyy");
        
        if( listaRecoleccion == null ) {
            listaRecoleccion = new ArrayList< SelectItem >();
            RecoleccionDao recoleccionDao = FabricaDAO.crearRecoleccionDao();
            for( Recoleccion recoleccion : recoleccionDao.buscarTodos() ) {
                SelectItem item = new SelectItem( recoleccion, fecha.format(recoleccion.getFecharecoleccion()));
                listaRecoleccion.add( item );
            }
        }
        return listaRecoleccion;
    }

    public Acuatico castAcuatico(Especimen especimen) {
        return (Acuatico)especimen;
    }
    
    public Terrestre castTerrestre(Especimen especimen) {
        return (Terrestre)especimen;
    }

    /**
     * @return the codigo
     */
    public String getCodigo() {
        return codigo;
    }

    /**
     * @param codigo the codigo to set
     */
    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }

    /**
     * @return the muestra
     */
    public Especimen getMuestra() {
        return muestra;
    }

    /**
     * @param muestra the muestra to set
     */
    public void setMuestra(Especimen muestra) {
        this.muestra = muestra;
    }

    /**
     * @return the tieneValor
     */
    public boolean isTieneValor() {
        
        this.tieneValor = getCodigo().equals("");
        
        return !tieneValor;
    }

 /**
  * revisa si el codigo es nulo al principio
  * @param tieneValor 
  */
    public void setTieneValor(boolean tieneValor) {
        this.tieneValor = tieneValor;
    }

/**
 * Metodo que obtiene el tipo de reporte
 *  
 */
    public String getTipoReporte() {
        return tipoReporte;
    }

    /**
     * Metodo que asigna el tipo de reporte 
     *  
     */
    public void setTipoReporte(String reporte, String reporteSF) {
         this.tipoReporteCF = reporte;
         this.tipoReporteSF = reporteSF;
         if (this.usaFoto == true ){
             this.tipoReporte = this.tipoReporteCF;
         }
         else{
             this.tipoReporte = this.tipoReporteSF;
         }
         
       
    }

    /**
     * @return the especimenSeleccionado
     */
    public Especimen getEspecimenSeleccionado() {
        return especimenSeleccionado;
    }

    /**
     * @param especimenSeleccionado the especimenSeleccionado to set
     */
    public void setEspecimenSeleccionado(Especimen especimenSeleccionado) {
        if (especimenSeleccionado !=null){
             setCodigo(especimenSeleccionado.getCodigoespecimen());
        setRutaFoto("C:\\Sizoo\\fotos\\"+getCodigo()+".jpg");
        this.especimenSeleccionado = especimenSeleccionado;
        obtenerRutaReporte(getEspecimenSeleccionado(), getEspecimenSeleccionado().getRecoleccion());
        }
       
    }
    
    public void onRowSelect(SelectEvent event) {  
        
        FacesMessage msg = new FacesMessage("Especimen seleccionado", ((Especimen) event.getObject()).getCodigoespecimen());  
  
        FacesContext.getCurrentInstance().addMessage(null, msg);  
    }  
    
   public void inicio(SelectEvent event){
       
   }

    /**
     * @return the rutaFoto
     */
    public String getRutaFoto() {
        return rutaFoto;
    }

    /**
     * @param rutaFoto the rutaFoto to set
     */
    public void setRutaFoto(String rutaFoto) {
        this.rutaFoto = rutaFoto;
    }

    /**
     * @return the usaFoto
     */
    public boolean isUsaFoto() {
        return usaFoto;
    }

    /**
     * @param usaFoto the usaFoto to set
     */
    public void setUsaFoto(boolean usaFoto) {
        this.usaFoto = usaFoto;
    }
    
    /**
     * Metodo utilizado si el reporte lleva fotografia
     */
    public void reporteConFoto(){
        this.tipoReporte = usaFoto ? this.tipoReporteSF : this.tipoReporteCF;
        System.out.println(this.tipoReporte);
    }
    

}